package Model.symtable;

import java.util.ArrayList;
import java.util.Collection;


// corresponde a uma declaracão de método na tabela de s�mbolos
public class EntryMethod extends EntryTable {
    public EntryClass type; // tipo de retorno do m�todo
    //public int dim; // n�mero de dimensões do retorno
    public Collection<EntryVar> params; // tipo dos parâmetros
    public Collection<EntryVar> variaveis;
    //public boolean fake; // true se é um falso construtor
    public boolean hassuper; // true se método possui chamada super
    private boolean main;
    public EntryMethod() {
        this.params = new ArrayList<>();
        this.variaveis = new ArrayList<>();
        //this.name =n ;
        //this.type = type;
        //this.params = params;
        this.hassuper = false;
        this.main = false;
    }
    // cria elemento para inserir na tabela 
    public EntryMethod(String n, EntryClass type, int d, ArrayList<EntryVar> params) {
        this.params = new ArrayList<>();
        this.variaveis = new ArrayList<>();
        this.name = n;
        this.type = type;
        //this.dim = d;
        this.params = params;
        //this.fake = false;
        this.hassuper = false;
        this.main = false;
    }

    public EntryMethod(String n, EntryClass type, ArrayList<EntryVar> params) {
        this.params = new ArrayList<>();
        this.variaveis = new ArrayList<>();
        this.name = n;
        this.type = type;
        this.params = params;
        //this.fake = false;
        this.hassuper = false;
        this.main = false;
    }
    public EntryMethod(String n, EntryClass type) {
        this.params = new ArrayList<>();
        this.variaveis = new ArrayList<>();
        this.name = n;
        this.type = type;
        //this.fake = false;
        this.hassuper = false;
        this.main = false;
    }

    public EntryClass getType() {
        return type;
    }
    
    public void setType(EntryClass type) {
        this.type = type;
    }

    public Collection<EntryVar> getParams() {
        return params;
    }

    public void setParams(Collection<EntryVar> params) {
        this.params = params;
    }

    public boolean isHassuper() {
        return hassuper;
    }

    public void setHassuper(boolean hassuper) {
        this.hassuper = hassuper;
    }

    public boolean isMain() {
        return main;
    }

    public Collection<EntryVar> getVariaveis() {
        return variaveis;
    }

    public void setVariaveis(Collection<EntryVar> variaveis) {
        this.variaveis = variaveis;
    }

    public void setMain(boolean main) {
        this.main = main;
    }
    public EntryVar getParam(String nome){
        for (EntryVar var : this.params) {
            if (var.getName() != null) {
                if (var.getName().equals(nome)) {
                    return var;
                }
            }
        }
        return null;
    }
    public EntryVar getVariable(String nome) {
        for (EntryVar var : this.params) {
            if (var.getName() != null) {
                if (var.getName().equals(nome)) {
                    return var;
                }
            }
        }
        for (EntryVar var : variaveis) {
            if (var.getName() != null) {
                if (var.getName().equals(nome)) {
                    return var;
                }
            }
        }
        return null;
    }

    
}
